☁️ cloud | June 03, 2021
VPC 엔드포인트의 게이트웨이 엔드포인트와 인터페이스 엔드포인트 기능 활용하여, AWS 특정 서비스에 대한 프라이빗 연결을 확인하고 통신 과정을 실습
Parameters:
KeyName:
Description: Name of an existing EC2 KeyPair to enable SSH access to the instances. Linked to AWS Parameter
Type: AWS::EC2::KeyPair::KeyName
ConstraintDescription: must be the name of an existing EC2 KeyPair.
LatestAmiId:
Description: (DO NOT CHANGE)
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
AllowedValues:
- /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Resources:
CloudNetaVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
Tags:
- Key: Name
Value: CloudNeta-VPC
CloudNetaIGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: CloudNeta-IGW
CloudNetaIGWAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref CloudNetaIGW
VpcId: !Ref CloudNetaVPC
CloudNetaPublicRT:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref CloudNetaVPC
Tags:
- Key: Name
Value: CloudNeta-Public-RT
DefaultPublicRoute:
Type: AWS::EC2::Route
DependsOn: CloudNetaIGWAttachment
Properties:
RouteTableId: !Ref CloudNetaPublicRT
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref CloudNetaIGW
CloudNetaPrivateRT:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref CloudNetaVPC
Tags:
- Key: Name
Value: CloudNeta-Private-RT
CloudNetaPublicSN:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref CloudNetaVPC
AvailabilityZone: !Select [0, !GetAZs '']
CidrBlock: 10.0.0.0/24
Tags:
- Key: Name
Value: CloudNeta-Public-SN
CloudNetaPrivateSN:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref CloudNetaVPC
AvailabilityZone: !Select [2, !GetAZs '']
CidrBlock: 10.0.1.0/24
Tags:
- Key: Name
Value: CloudNeta-Private-SN
CloudNetaPublicSNRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref CloudNetaPublicRT
SubnetId: !Ref CloudNetaPublicSN
CloudNetaPrivateSNRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref CloudNetaPrivateRT
SubnetId: !Ref CloudNetaPrivateSN
CloudNetaSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
VpcId: !Ref CloudNetaVPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '80'
ToPort: '80'
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: '22'
ToPort: '22'
CidrIp: 0.0.0.0/0
CloudNetaPublicEC2:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: !Ref LatestAmiId
KeyName: !Ref KeyName
Tags:
- Key: Name
Value: CloudNeta-Public-EC2
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref CloudNetaPublicSN
GroupSet:
- !Ref CloudNetaSecurityGroup
AssociatePublicIpAddress: true
CloudNetaPrivateEC2:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: !Ref LatestAmiId
KeyName: !Ref KeyName
Tags:
- Key: Name
Value: CloudNeta-Private-EC2
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref CloudNetaPrivateSN
GroupSet:
- !Ref CloudNetaSecurityGroup
UserData:
Fn::Base64: !Sub |
#!/bin/bash
(
echo "qwe123"
echo "qwe123"
) | passwd --stdin root
sed -i "s/^PasswordAuthentication no/PasswordAuthentication yes/g" /etc/ssh/sshd_config
sed -i "s/^#PermitRootLogin yes/PermitRootLogin yes/g" /etc/ssh/sshd_config
service sshd restart
스택 세부정보 설정
처음 퍼블릭 EC2에 접근 후 AWS-S3 서비스로 통신 확인
SSH 프로토콜을 통해 로컬 네트워크로 프라이빗 EC2 접근(암호 입력 방식)
이전에 프라이빗 라우팅에는 로컬 네트워크만 등록되어 있던 상태
엔드포인트 생성과 함께 S3 서비스를 엔드포인트에 등록, 프라이빗 라우팅 테이블도 등록
S3 서비스 연결을 위해 게이트웨이 엔드포인트를 생성, 실제 EC2 인스턴스에 접속하여 통신 검증
이번 실습에서는 S3와 DynamoDB가 아닌 CloudFormation 서비스로 변경하여 통신을 실험
dig
명령어를 통해 CloudFormation DNS 주소에 대한 IP 주소를 확인
$ dig +short cloudformation.ap-northeast-2.amazonaws.com
중요내용
인터페이스 엔드포인트의 설정 값중에 프라이빗 DNS 활성화 설정 여부에 따라 통신흐름이 바뀌게 됩니다.
기본 DNS 호스트는 동일한 형태이지만, 엔드포인트 전용 DNS 호스트는 개별적으로 다른 형태의 주소를 가집니다.
해당 인터페이스 엔드포인트는 프라이빗 서브넷 내에 배치되었으며, CloudFormation과 연결되어 있습니다.
실제 EC2 환경에서 CloudFormation의 DNS 주소에 대한 매핑 정보를 검증하고, 최초 환경과 통신 흐름을 비교
dig
명령어를 통해 검증기존에 생성한 인터페이스 엔드포인트 삭제 후 재생성
재생성 후, 테스트 결과
따라하며 배우는 AWS 네트워크 입문